package com.tencent;

import java.util.HashMap;

/**
 * Description:
 * Copyright:   Copyright (c)2019
 * Company:     zefu
 *
 * @author: 张李鑫
 * @version: 1.0
 * Create at:   2021-09-30 12:20:38
 * <p>
 * Modification History:
 * Date         Author      Version     Description
 * ------------------------------------------------------------------
 * 2021-09-30     张李鑫                     1.0         1.0 Version
 */
public class LRUCache {

    private HashMap<Integer, Integer> map;
    private Integer[] arr = null;
    private Integer maxSize = 0;
    private Integer arrIndex = 0;
    private Integer firstIndex = 0;

    public LRUCache(int capacity) {
        map = new HashMap();
        maxSize = capacity;
        arr = new Integer[capacity];
    }

    /**
     * LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
     * int get(int key) 如果关键字 key 存在于缓存中，则返回关键字的值，否则返回 -1 。
     * void put(int key, int value) 如果关键字已经存在，则变更其数据值；如果关键字不存在，则插入该组「关键字-值」。当缓存容量达到上限时，它应该在写入新数据之前删除最久未使用的数据值，从而为新的数据值留出空间。
     * <p>
     * <p>
     * 作者：力扣 (LeetCode)
     * 链接：https://leetcode-cn.com/leetbook/read/tencent/x57w6h/
     * 来源：力扣（LeetCode）
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     *
     * @param key
     * @return
     */
    public int get(int key) {
        Integer orDefault = map.getOrDefault(key, -1);
        return orDefault == -1 ? -1 : arr[orDefault];
    }

    public void put(int key, int value) {
        if (maxSize == 0) {
            return;
        }
        if (!map.containsKey(key) && arrIndex.equals(maxSize - 1)) {
            firstIndex = firstIndex >= maxSize - 1 ? 0 : firstIndex;
            map.put(key, firstIndex);
            arr[firstIndex] = value;
        } else {
            Integer orDefault = map.getOrDefault(key, arrIndex);
            map.put(key, orDefault);
            arr[orDefault] = value;
            arrIndex++;
        }
    }

    public static void main(String[] args) {
        LRUCache lRUCache = new LRUCache(2);
        lRUCache.put(1, 1); // 缓存是 {1=1}
        lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
        System.out.println(lRUCache.get(1));
        lRUCache.put(3, 3); // 该操作会使得关键字 2 作废，缓存是 {1=1, 3=3}
        System.out.println(lRUCache.get(2));
        lRUCache.put(4, 4); // 该操作会使得关键字 1 作废，缓存是 {4=4, 3=3}
        System.out.println(lRUCache.get(1));
        System.out.println(lRUCache.get(3));
        System.out.println(lRUCache.get(4));
    }
}
